package com.hz.userService.service;

import com.hz.apiService.model.domain.StudentDTO;
import com.hz.apiService.model.domain.TeacherDTO;
import com.hz.userService.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * @author li
 * @description 针对表【users(用户表)】的数据库操作Service
 * @createDate 2023-09-23 17:13:32
 */
public interface UserService extends IService<User> {

    /**
     * @param username  用户名
     * @param realName  真实姓名
     * @param sex       性别
     * @param studentId 学号（6位）
     * @param password  密码
     * @param userType  用户类型
     * @author LiiiYiAn
     * @createDate 2023/9/24 14:15
     * @description 添加用户
     * @return boolean 添加结果
     **/
    int addUser(String username, String realName, Integer sex, String studentId,
                String password, Integer userType);

    List<TeacherDTO> allTeachers();

    TeacherDTO getTeacherById(Integer teacherId);

    StudentDTO getStudentById(Integer studentId);

    /**
     * @author LiiiYiAn
     * @createDate 2023/9/24 18:29
     * @description 删除指定ID用户（逻辑删除），并删除其Redis缓存
     * @return boolean 修改结果
     * @param id 用户ID
     **/
    int deleteUserById(Integer id);

    /**
     * @author LiiiYiAn
     * @createDate 2023/9/24 18:22
     * @description 修改用户信息，并更新其存储到Redis的缓存
     * @param u 修改用户信息
     * @return boolean 修改结果
     **/
    String updateUser(User u);

    /**
     * @param id 用户ID
     * @return com.hz.userService.domain.User 查询用户数据
     * @author LiiiYiAn
     * @createDate 2023/9/24 14:30
     * @description 根据ID查询用户，并将其存储到Redis缓存
     **/
    String findUserById(Integer id);

    /**
     * @author LiiiYiAn
     * @createDate 2023/10/4 22:21
     * @description 根据用户名查询用户，并将其存储到Redis缓存
     * @param username 用户名
     * @return java.lang.String 查询用户数据
     **/
    String findUserByUsername(String username);

    /**
     * @param username 用户名
     * @param password 用户密码
     * @param userType 用户类型
     * @return java.lang.String 登录用户信息JSON格式
     * @author LiiiYiAn
     * @createDate 2023/9/24 14:16
     * @description 用户登录
     **/
    String login(String username, String password, Integer userType);

    /**
     * @author LiiiYiAn
     * @createDate 2023/9/25 15:30
     * @description 退出登录
     * @param username 用户名
     * @return int 状态码，1表示退出用户成功
     **/
    int logout(String username);

    /**
     * @author LiiiYiAn
     * @createDate 2023/9/24 20:56
     * @description 修改密码，将修改结果更新到Redis缓存
     * @param id 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @param newPassword2 再次输入新密码
     * @return int 1表示旧密码匹配失败；2表示两次输入的新密码不匹配；3表示修改成功
     **/
    int changePasswordById(Integer id, String oldPassword, String newPassword, String newPassword2);
}
